import torchvision.models.resnet
import torch.nn
import torch.nn.functional

resnet = torchvision.models.resnet.resnet101()
resnet = torchvision.models.inception_v3()



# 卷积 conv
# 数学意义: 输入和卷积内核按行优先一维化后矩阵相乘
# 一维卷积Conv1d; in_channels 输入通道, out_channels 输出通道等价于卷积核的个数, kernel_size 卷积核大小, stride 步长, padding 填充四个边, padding_mode 填充内容, dilation 卷积核元素间距, groups 分组, bias 可学习的偏见输出
# 一维卷积输入形状(批大小, 通道数, 长), 输出同输入
# 二维卷积Conv2d; in_channels 输入通道, out_channels 输出通道等价于卷积核的个数, kernel_size 卷积核大小, stride 步长, padding 填充四个边, padding_mode 填充内容, dilation 卷积核元素间距, groups 分组, bias 可学习的偏见输出
# 二维卷积输入形状(批大小, 通道数, 高, 宽), 输出同输入
# 三维卷积Conv2d; in_channels 输入通道, out_channels 输出通道等价于卷积核的个数, kernel_size 卷积核大小, stride 步长, padding 填充四个边, padding_mode 填充内容, dilation 卷积核元素间距, groups 分组, bias 可学习的偏见输出
# 三维卷积输入形状(批大小, 通道数, 深, 高, 宽)(N, C, D, H, W), 输出同输入
conv1 = torch.nn.Conv1d(in_channels=1, out_channels=1, kernel_size=3, stride=1, padding=0, padding_mode='zeros',
                       dilation=1, groups=1, bias=False, device=None, dtype=None)
# 可以手动设置卷积权重, 但是要和内核大小保持一致,  否则会覆盖内核大小
conv1.weight.data = torch.tensor([[[0, 1, 3]]], dtype=torch.float)
input = torch.tensor([[[1, 1, 0, 2, 3, 1]]], dtype=torch.float)
out = conv1(input)
conv = torch.nn.Conv2d(in_channels=1, out_channels=1, kernel_size=2, stride=1, padding=0, padding_mode='zeros',
                       dilation=1, groups=1, bias=False, device=None, dtype=None)
conv.weight.data = torch.tensor([[[[1, 2], [2, 3]]]], dtype=torch.float32)
# conv.weight.data.zero_()

# 输入多个张量  每个张量的形状中通道数必须和卷积核中的输入通道数相等, 且格式也为 (批大小, 通道数, 高, 宽)
input = torch.tensor([[[[1, 2, 3], [11, 22, 33], [111, 222, 333]]]], dtype=torch.float)
out = conv(input)

# 或使用函数式编程
out = torch.nn.functional.conv2d(input=input, weight=torch.tensor([[[[1, 2], [2, 3]]]], dtype=torch.float32))




# 全连接层 linear
# 数学意义: y = ax + b, 其中x是输入，A是权值，b是偏置，y是输出
line = torch.nn.Linear(2, 2, bias=False)
line.weight.data = torch.tensor([[1, 1, 1], [1, 1, 2]], dtype=torch.float)
# 输入多个张量 每个张量的列必须和权重的行相等
input = torch.tensor([[1, 2, 3], [2, 2, 3]], dtype=torch.float)
out = line(input)

print("111")
